<?php

namespace app\test715\controller;

use app\admin\model\system\SystemAdmin;
use app\admin\model\system\SystemMenus;
use app\admin\model\system\SystemRole;
use behavior\system\SystemBehavior;
use service\HookService;
use think\Controller;
use think\Url;


class AuthController extends SystemBasic
{

    /**
     * 当前登陆管理员信息
     * @var
     */
    protected $adminInfo;

    /**
     * 当前登陆管理员ID
     * @var
     */
    protected $adminId;

    /**
     * 当前管理员权限
     * @var array
     */
    protected $auth = [];

    protected $skipLogController = ['index', 'common'];

    /**
     * Notes:在该控制器的方法调用之前首先执行。
     * User: 大飞
     * Date: 2021/7/15
     * Time: 15:49
     */
    protected function _initialize()
    {
        parent::_initialize();
        //如果没有用户登录信息的话 就返货登录页面
        if (!SystemAdmin::hasActiveAdmin()) return $this->redirect('Login/index');
        //异常处理
        try {
            //获取用户最新登录信息
            $adminInfo = SystemAdmin::activeAdminInfoOrFail();
        } catch (\Exception $e) {
            //否者返回错误 获取错误信息  返回登录界面
            return $this->failed(SystemAdmin::getErrorInfo($e->getMessage()), Url::build('Login/index'));
        }
        //将用户信息给赋值
        $this->adminInfo = $adminInfo;
        //用户id 赋值
        $this->adminId = $adminInfo['id'];
        //获得当前用户最新信息
        $this->getActiveAdminInfo();
        //获取用户登录权限
        $this->auth = SystemAdmin::activeAdminAuthOrFail();
        //权限处理
        $this->adminInfo->level === 0 || $this->checkAuth();
        //渲染页面内容
        $this->assign('_admin', $this->adminInfo);
        //监听行为  传递 用户信息    和开启系统后台记录
        HookService::listen('admin_visit', $this->adminInfo, 'system', false, SystemBehavior::class);
    }


    /**
     * Notes:权限处理
     * User: 大飞
     * Date: 2021/7/15
     * Time: 15:53
     * @param null $action
     * @param null $controller
     * @param null $module
     * @param array $route
     * @return bool
     */
    protected function checkAuth($action = null, $controller = null, $module = null, array $route = [])
    {
        //代表 管理员权限 为空
        static $allAuth = null;
        //如果为空 则去查询当前管理员 权限
        if ($allAuth === null) $allAuth = SystemRole::getAllAuth();
        //如果当前的模块名为空  设置或者获取当前的模块名
        if ($module === null) $module = $this->request->module();
        //如果当前的控制器名为空 设置或者取当前的模块名
        if ($controller === null) $controller = $this->request->controller();
        //如果当前的方法名为空  设置或者取当前的方法名
        if ($action === null) $action = $this->request->action();
        //设置获取路由参数
        if (!count($route)) $route = $this->request->route();

        //在数组里  转小写(控制器名)      返回true
        if (in_array(strtolower($controller), $this->skipLogController, true)) return true;
        //拼接权限url 地址
        $nowAuthName = SystemMenus::getAuthName($action, $controller, $module, $route);
        //拼接权限url 地址
        $baseNowAuthName = SystemMenus::getAuthName($action, $controller, $module, []);
        //判断在数组里 或者  不在数组里  且 在数组里 或者 不在数组里
        if ((in_array($nowAuthName, $allAuth) && !in_array($nowAuthName, $this->auth)) || (in_array($baseNowAuthName, $allAuth) && !in_array($baseNowAuthName, $this->auth)))
            exit($this->failed('没有权限访问!'));
        //终止 返回一个错误提示信息 没有权限访问
        return true;
    }


    /**
     * 获得当前用户最新信息
     * @return SystemAdmin
     */
    protected function getActiveAdminInfo()
    {
        //直接取值
        $adminId = $this->adminId;
        //根据id 查询 获得有效管理员信息
        $adminInfo = SystemAdmin::getValidAdminInfoOrFail($adminId);
        //如果没有 提示错误信息 请登录
        if (!$adminInfo) $this->failed(SystemAdmin::getErrorInfo('请登陆!'));
        //重写用户信息
        $this->adminInfo = $adminInfo;
        //保存当前登陆用户信息 存进session
        SystemAdmin::setLoginInfo($adminInfo);
        return $adminInfo;
    }

}
